package com.garnier.android.lecteurrss;

import java.util.ArrayList;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
 * 
 * @author thibault kuprowski
 * 
 */

/** class ParserXMLHandler
 *  
 * parsing d'un texte XML par la méthode Sax
 */
public class ParserXMLHandler extends DefaultHandler {

	// nom des tags XML
	private final String ITEM = "item";
	private final String TITLE = "title";
	private final String LINK = "link";
	private final String PUBDATE = "pubDate";
	private final String CREATOR = "creator";
	private final String DESCRIPTION = "description";

	// Array list des articles
	private ArrayList<Article> articles;

	// Boolean permettant de savoir si nous sommes a l'interieur d'un item
	private boolean inItem;

	// Article courant
	private Article currentFeed;

	// Buffer permettant de contenir les donn�es d'un tag XML
	private StringBuffer buffer;

	@Override
	public void processingInstruction(String target, String data) throws SAXException {		
		super.processingInstruction(target, data);
	}

	public ParserXMLHandler() {
		super();		
	}


	// * Cette methode est appelee par le parser une et une seule  
	// * fois au demarrage de l'analyse de votre flux xml. 
	// * Elle est appelee avant toutes les autres methodes de l'interface,  
	// * a l'exception unique, evidemment, de la methode setDocumentLocator. 
	// * Cet evenement devrait vous permettre d'initialiser tout ce qui doit 
	// * l'etre avant le debut du parcours du document.

	@Override
	public void startDocument() throws SAXException {
		super.startDocument();
		articles = new ArrayList<Article>();

	}

	/* 
	 * Fonction etant declenchee lorsque le parser trouve un tag XML
	 * C'est cette methode que nous allons utiliser pour instancier un nouvell article
	 *  	
	 *  */
	@Override
	public void startElement(String uri, String localName, String name,	Attributes attributes) throws SAXException {
		// Nous reinitialisons le buffer a chaque fois qu'il rencontre un item
		buffer = new StringBuffer();		

		// Ci dessous, localName contient le nom du tag rencontre

		// Nous avons rencontre un tag ITEM, il faut donc instancier un nouvel article
		if (localName.equalsIgnoreCase(ITEM)){			
			this.currentFeed = new Article();
			inItem = true;
		}

		// Vous pouvez definir des actions a effectuer pour chaque item rencontre
		if (localName.equalsIgnoreCase(TITLE)){
			// Rien a fair ici
		}
		if (localName.equalsIgnoreCase(LINK)){
			// Rien a fair ici
		}
		if (localName.equalsIgnoreCase(PUBDATE)){	
			// Rien a fair ici	
		}
		if (localName.equalsIgnoreCase(CREATOR)){
			// Rien a fair ici
		}
		if(localName.equalsIgnoreCase(DESCRIPTION)){
			// Rien a fair ici
		}
	}


	// * Fonction declenche lorsque le parser a parse 	
	// * l'interieur de la balise XML La methode characters  
	// * a donc fait son ouvrage et tous les caractere inclus 
	// * dans la balise en cours sont copies dans le buffer 
	// * On peut donc tranquillement les recuperer pour completer
	// * notre article currentFeed

	@Override
	public void endElement(String uri, String localName, String name) throws SAXException {		

		if (localName.equalsIgnoreCase(TITLE)){
			if(inItem){				
				// Les caracteres sont dans l'objet buffer
				this.currentFeed.setTitle(buffer.toString());				
				buffer = null;
			}
		}
		if (localName.equalsIgnoreCase(LINK)){
			if(inItem){				
				this.currentFeed.setLink(buffer.toString());				
				buffer = null;
			}
		}
		if (localName.equalsIgnoreCase(PUBDATE)){	
			if(inItem){				
				this.currentFeed.setPubDate(buffer.toString());				
				buffer = null;
			}
		}
		if (localName.equalsIgnoreCase(CREATOR)){
			if(inItem){				
				this.currentFeed.setCreator(buffer.toString());				
				buffer = null;	
			}
		}
		if(localName.equalsIgnoreCase(DESCRIPTION)){
			if(inItem){				
				this.currentFeed.setDescription(buffer.toString());				
				buffer = null;
			}
		}
		if (localName.equalsIgnoreCase(ITEM)){		
			articles.add(currentFeed);
			inItem = false;
		}
	}

	// * Tout ce qui est dans l'arborescence mais n'est pas partie  
	// * integrante d'un tag, declenche la levee de cet evenement.  
	// * En general, cet evenement est donc leve tout simplement 
	// * par la presence de texte entre la balise d'ouverture et 
	// * la balise de fermeture

	public void characters(char[] ch,int start, int length)	throws SAXException{		
		String lecture = new String(ch,start,length);
		if(buffer != null) buffer.append(lecture);      		
	}


	// cette methode nous permettra de recuperer les donnes
	public ArrayList<Article> getData(){
		return articles;
	}
}
